package mpbe.estructura.secciones.hormigon_armado.graficos;

/*
 * Este codigo es software libre y se encuentra licenciado 
 * bajo los términos de la Licencia Pública General de GNU versión 3 
 * según se encuentra publicada por la Free Software Foundation.
 * http://www.gnu.org/licenses/gpl.html
 * 
 * Autor: Martin Pablo Bellanca <martin.bellanca@gmail.com>
 * web: http://mpbe.blogspot.com/
 */

import mpbe.MPBE;
import mpbe.estructura.secciones.hormigon_armado.Barra_Redonda;
import mpbe.estructura.secciones.hormigon_armado.EsfuerzosUltimos;
import mpbe.estructura.secciones.hormigon_armado.Hormigon_armado;
import mpbe.estructura.secciones.hormigon_armado.RectaUltima;
import mpbe.estructura.secciones.hormigon_armado.SHFlexion;
import mpbe.estructura.secciones.hormigon_armado.SHGrupo_de_Barras;
import mpbe.geometria.Limites;

import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Drawable;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.graphics.Transform;
import org.eclipse.swt.widgets.Display;

/**
 * @author mpbe
 *
 */
public class SHDibTensiones {
	public DibTensionesDibujar DIBUJAR = null;
	public DibTensionesColores COLORES = null;
	
	//Seccion
	private Hormigon_armado seccion = null;
	private Limites limitesVSeccion= null;
	private Limites limitesHSeccion = null; 
	
	private double escalaX = 0; //escala del dibujo
	private double escalaY = 0; 
	private int corrimientoX; //distancia ejes globales a ejes locales de la seccion 
	private int corrimientoY;
	
	// diametros
	private int diamNodos;
	private int diamBarras;
	
	// varias
	private double decRedondeo;
	
	// Internas
	private Display display = null; //pasar como variable externa en el constructorsi no se puede obtener
	private Rectangle area = null;
//	private Drawable img = null;
	private GC gc = null;
	
	//************************************
	// Constructores
	//************************************
	public SHDibTensiones(Display display) {
		//Objetos a dibujar por defecto
		DIBUJAR = new DibTensionesDibujar();
		// colores por defecto
		COLORES = new DibTensionesColores();

		// diametros por defecto
		diamNodos = 8;
		diamBarras = 8;
		
		this.display = display;
		
	}
	public SHDibTensiones(Display display, GC gc) {
		//Objetos a dibujar por defecto
		DIBUJAR = new DibTensionesDibujar();
		// colores por defecto
		COLORES = new DibTensionesColores();

		// diametros por defecto
		diamNodos = 8;
		diamBarras = 8;
		
		this.display = display;
//		this.img = img;
		this.gc = gc;
	}
	
	//------------------------------------------------------------
	// Funciones de Dibujo del diagrama de tensiones
	//------------------------------------------------------------
	public boolean dibujar_Tension (double escalaX, double escalaY, int corrimientoX, int corrimientoY, Rectangle area){
		decRedondeo = seccion.getGenerales().uLongitud.Coef*100;
		this.escalaX = escalaX;
		this.escalaY = escalaY;
		this.corrimientoX = corrimientoX;
		this.corrimientoY = corrimientoY;
		this.area = area;

		double escFuerzas = area.width/2/Math.abs(seccion.getResultados().esfuerzo_ultimos.Dbu);
		EsfuerzosUltimos EU = seccion.getResultados().esfuerzo_ultimos;
		if (Math.abs(EU.Dbu)<Math.abs(EU.Zu))
			escFuerzas = area.width/3/Math.abs(seccion.getResultados().esfuerzo_ultimos.Zu);

		if (DIBUJAR.isDibTensionEjes()) dibTensionEjes();
		if (DIBUJAR.isDibTensionBarras()) dibTensionBarras(); 
		if (DIBUJAR.isDibTensionEjeN()) SHDibujar.dibEjeNeutro(gc, corrimientoX, corrimientoY, escalaY, area, display.getSystemColor(COLORES.getColorEjeNeutro()), seccion);
		if (DIBUJAR.isDibTensionDiagTH()) dibTensionDiagTH();
		if (DIBUJAR.isDibTensionDiagTA()) dibTensionDiagTA();
		if (DIBUJAR.isDibTensionFuerzasI()) dibTensionFuerzasI(escFuerzas);
		if (DIBUJAR.isDibTensionFuerzasE()) dibTensionFuerzasE(escFuerzas);
		if (DIBUJAR.isDibTensionCotas()) dibTensionCotas();
		return true;
	}

	private void dibTensionEjes(){ //PASADO A LAYER
		int dx = area.x;
		int dy = area.y;
		
		// puntos de referencia
		Limites limV = seccion.contornos.getLimitesV();
		int Xbi = dx+5;
		int Xbd = dx+area.width-5;
		int X0 = dx+SHDibujar.transformar(0, corrimientoX, escalaX);
		int Ybs = dy+SHDibujar.transformar(limV.min, corrimientoY, escalaY);
		int Ybi = dy+SHDibujar.transformar(limV.max, corrimientoY, escalaY);
		int Yxg= dy+SHDibujar.transformar(0, corrimientoY, escalaY);

		
		// dibuja Ejes X
		gc.setForeground(display.getSystemColor(COLORES.getColorEjes())); 
		gc.setBackground(display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
		gc.setLineWidth(1);
		gc.setLineStyle(SWT.LINE_DASHDOT);		
		
		gc.drawLine(Xbi, Yxg, Xbd, Yxg);
		gc.drawText("Xg", Xbd-8, Yxg-20);
		
		// Dibuja Ejes Y
		gc.setLineStyle(SWT.LINE_SOLID);
		gc.setLineWidth(3);
		gc.setForeground(display.getSystemColor(COLORES.getColorContornos()));
		
		gc.drawLine(X0, Ybs, X0, Ybi);
		//gc.drawText("Y", dx+XaGobal(0, corrimientoX, escala)+8, dy+0);
		
		//borde sup e inf de la viga
		gc.setLineWidth(1);
		gc.drawLine(Xbi, Ybs, X0, Ybs);
		gc.drawLine(Xbi, Ybi, X0, Ybi);
		
	}
	private void dibTensionBarras(){ //PASADO A LAYER
		int dx = area.x;
		int dy = area.y;
		
		// propiedades de la linea
		gc.setLineWidth(diamBarras);
		gc.setLineStyle(SWT.LINE_CUSTOM);
		gc.setForeground(display.getSystemColor(COLORES.getColorBarras())); 
		gc.setBackground(display.getSystemColor(COLORES.getColorBarras()));
		
		// puntos de referencia
		int Xbi = dx+5;
		int X0 = dx+SHDibujar.transformar(0, corrimientoX, escalaX);
		// dibuja el barras
		int cangr = seccion.grupos.size();
		SHGrupo_de_Barras gb = null;
		Barra_Redonda br = null;
		for (int gg = 0; gg<cangr; gg++){
			gb = seccion.grupos.get(gg);
			if (gb.activo) {
				for (int bb=0; bb<gb.barras.size(); bb++){
					br = gb.barras.get(bb);
					// dibuja la barra
					int YY = dy+SHDibujar.transformar(br.posY, corrimientoY, escalaY);
					gc.drawLine(Xbi, YY, X0, YY);					
				}
			}
		}
	}
	private void dibTensionDiagTH() { //PASADO A LAYER
		int dx = area.x;
		int dy = area.y;
		
		// propiedades de la linea
		gc.setLineWidth(2);
		gc.setLineStyle(SWT.LINE_SOLID);
		gc.setForeground(display.getSystemColor(COLORES.getColorDiagTH())); 
		gc.setBackground(display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
		
		// puntos de referencia
		Limites limV = seccion.contornos.getLimitesV();
		
		SHFlexion resCal = seccion.getResultados();
		double Br = seccion.getGenerales().hormigon.Bf;
		double escalaT = area.width/3/Br;
		
		int X0 = dx+SHDibujar.transformar(0, corrimientoX, escalaX);
		int Ybs = dy+SHDibujar.transformar(limV.max, corrimientoY, escalaY);
		int Yen = dy+SHDibujar.transformar(limV.max-resCal.recta_ultima.X, corrimientoY, escalaY);
		
		double T = Th(limV.max, resCal.recta_ultima, Br, limV.max);
		int Xbr = X0+(int)(T*escalaT);
		int Xa = X0;
		int Ya = Yen;
	
		// Dibujq
		//gc.drawLine(X0, Ybs, Xbr, Ybs);		
		for (double YY = limV.max-resCal.recta_ultima.X; YY <= (limV.max+.1); YY+=resCal.recta_ultima.X/10) {
			T = Th(YY, resCal.recta_ultima, Br, limV.max);
			Xbr = X0+(int)(T*escalaT);
			Ybs = dy+SHDibujar.transformar(YY, corrimientoY, escalaY);
			gc.drawLine(X0, Ybs, Xbr, Ybs);
			gc.drawLine(Xa, Ya, Xbr, Ybs);
			Xa = Xbr;
			Ya = Ybs;
		}
		// Dibuja Textos
		if (DIBUJAR.isDibTensionTextos()) {
			//Define la letra
			Font font = new Font(display,"Arial",10,SWT.NONE);
			gc.setFont(font);

			String txt = "Br="+String.valueOf(MPBE.redondear(T, 2));
			Point tamTXT = gc.stringExtent(txt);//Obtiene el ancho de los cuadros de texto	
			Xa =X0+(Xbr-X0)/2-tamTXT.x/2;
			gc.drawText(txt, Xa, Ybs-tamTXT.y-5, SWT.DRAW_TRANSPARENT);
		}
		
	}
	private double Th (double YY, RectaUltima RU, double Br, double Ymax) { //tension del hormigon
		double E = RU.Eb1*(YY-(Ymax-RU.X))/RU.X;//Deformacion en borde sup
		if (E<=-2) 
			return Br;
		else
			return Br*(Math.abs(E)-E*E/4);
	}
	private double Ta (double YY, RectaUltima RU, double Bs, double Ymax) { //tension del hormigon		
		Limites limV = seccion.contornos.getLimitesV();
		double h = seccion.geth();
		double Ese = seccion.getGenerales().acero.Ese;
		double Esi = (RU.Es2-RU.Eb1)*(limV.max-YY)/h+RU.Eb1;
		if (Math.abs(Esi)>Ese) 
			return Bs; 
		else 
			return Esi*Bs/Ese;
	}
	private void dibTensionDiagTA() { //PASADA A LAYER
		int dx = area.x;
		int dy = area.y;
		
		// propiedades de la linea
		gc.setLineWidth(3);
		gc.setLineStyle(SWT.LINE_SOLID);
		gc.setForeground(display.getSystemColor(COLORES.getColorDiagTH())); 
		gc.setBackground(display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
		
		// puntos de referencia
		Limites limV = seccion.contornos.getLimitesV();
		
		SHFlexion resCal = seccion.getResultados();
		double Bs = seccion.getGenerales().acero.Bf;
		//double escalaT = area.width/3/Bs;
		
		double T = Ta(resCal.esfuerzo_ultimos.z, resCal.recta_ultima, Bs, limV.max);
		//int Xbr = X0+(int)(T*escalaT);
		
		
		int X0 = dx+SHDibujar.transformar(0, corrimientoX, escalaX);
		int Xbr = X0+area.width/3;
		int YY = dy+SHDibujar.transformar(seccion.getResultados().esfuerzo_ultimos.z, corrimientoY, escalaY);
		
		gc.drawLine(X0, YY, Xbr, YY);
		
		// Dibuja Textos
		if (DIBUJAR.isDibTensionTextos()) {
			//Define la letra
			Font font = new Font(display,"Arial",10,SWT.NONE);
			gc.setFont(font);

			String txt = "Bs="+String.valueOf(MPBE.redondear(T, 2));
			Point tamTXT = gc.stringExtent(txt);//Obtiene el ancho de los cuadros de texto	
			int Xa =X0+(Xbr-X0)/2-tamTXT.x/2;
			gc.drawText(txt, Xa, YY+5, SWT.DRAW_TRANSPARENT);
		}
	}
	private void dibFuerza(int Xi, int Y, int valor) { //PASADO A LAYER
		// xi es el punto de aplicacion de la fuerza
		gc.drawLine(Xi, Y, Xi-valor, Y);
		int l= (int)(valor*0.1);
		gc.drawLine(Xi, Y, Xi-l, Y+l);
		gc.drawLine(Xi, Y, Xi-l, Y-l);	
	}
	private void dibTensionFuerzasI(double escFuerzas) { //PASADO A LAYER
		int dx = area.x;
		int dy = area.y;
		
		//Define la letra
		Font font = new Font(display,"Arial",10,SWT.NONE);
		gc.setFont(font);
		
		// propiedades de la linea
		gc.setLineWidth(3);
		gc.setLineStyle(SWT.LINE_SOLID);
		gc.setForeground(display.getSystemColor(COLORES.getColorFuerzasI())); 
		gc.setBackground(display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
		
		// puntos de referencia
		EsfuerzosUltimos EU = seccion.getResultados().esfuerzo_ultimos;
		int X0 = dx+SHDibujar.transformar(0, corrimientoX, escalaX)-10;
		// Dbu
		int valor = (int)(EU.Dbu*escFuerzas);
		int Y = dy+SHDibujar.transformar(EU.a, corrimientoY, escalaY);
		dibFuerza(X0+valor, Y, valor);
		// Dibuja Textos
		if (DIBUJAR.isDibTensionTextos()) {
			String txt = "Dbu="+String.valueOf(MPBE.redondear(EU.Dbu, 2));
			Point tamTXT = gc.stringExtent(txt);//Obtiene el ancho de los cuadros de texto	
			int Xa =X0+(valor)/2-tamTXT.x/2;
			gc.drawText(txt, Xa, Y-tamTXT.y-5, SWT.DRAW_TRANSPARENT);
		}
		
		//Zu
		valor = (int)(EU.Zu*escFuerzas);
		Y = dy+SHDibujar.transformar(EU.z, corrimientoY, escalaY);
		dibFuerza(X0, Y, valor);
		// Dibuja Textos
		if (DIBUJAR.isDibTensionTextos()) {
			String txt = "Zu="+String.valueOf(MPBE.redondear(EU.Zu, 2));
			Point tamTXT = gc.stringExtent(txt);//Obtiene el ancho de los cuadros de texto	
			int Xa =X0-(valor)/2-tamTXT.x/2;
			gc.drawText(txt, Xa, Y+5, SWT.DRAW_TRANSPARENT);
		}
		
		
	}
	private void dibTensionFuerzasE(double escFuerzas) { //PASADO A LAYER
		int dx = area.x;
		int dy = area.y;
		
		//Define la letra
		Font font = new Font(display,"Arial",10,SWT.NONE);
		gc.setFont(font);
		
		// propiedades de la linea
		gc.setLineWidth(2);
		gc.setLineStyle(SWT.LINE_SOLID);
		gc.setForeground(display.getSystemColor(COLORES.getColorFuerzasE())); 
		gc.setBackground(display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
		
		// puntos de referencia
		int X0 = dx+SHDibujar.transformar(0, corrimientoX, escalaX)+10;
		// Ns
		EsfuerzosUltimos EU = seccion.getResultados().esfuerzo_ultimos;
		int valor = (int)(EU.Nu*escFuerzas);
		int Y = dy+SHDibujar.transformar(0, corrimientoY, escalaY);
		dibFuerza(X0, Y, valor);
		// Dibuja Textos
		if (DIBUJAR.isDibTensionTextos()) {
			String txt = "Nu="+String.valueOf(MPBE.redondear(EU.Nu, 2));
			Point tamTXT = gc.stringExtent(txt);//Obtiene el ancho de los cuadros de texto	
			gc.drawText(txt, X0, Y-tamTXT.y-5,SWT.DRAW_TRANSPARENT);
		}

		// Ms
		int dia = (int)(area.height*.25);
		Y -= dia/2;
		gc.drawArc(X0-dia/2, Y, dia, dia, -90, 180);
		int l= (int)(25*escFuerzas);
		if (EU.Mu<0) Y+=dia;
		gc.drawLine(X0, Y, X0+l, Y+l);
		gc.drawLine(X0, Y, X0+l, Y-l);
		if (DIBUJAR.isDibTensionTextos()) {
			String txt = "Mu="+String.valueOf(MPBE.redondear(EU.Mu, 2));
			Point tamTXT = gc.stringExtent(txt);//Obtiene el ancho de los cuadros de texto	
			gc.drawText(txt, X0, Y-tamTXT.y-5, SWT.DRAW_TRANSPARENT);
		}
	}
	private void dibTensionCotas() {
		int dx = area.x;
		int dy = area.y;
		
		//Define la letra
		Font font = new Font(display,"Arial",10,SWT.NONE);
		gc.setFont(font);
		
		// propiedades de la linea
		gc.setLineWidth(1);
		gc.setLineStyle(SWT.LINE_SOLID);
		gc.setForeground(display.getSystemColor(COLORES.getColorCotasTXT())); 
		gc.setBackground(display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
		
		// puntos de referencia
		Limites limV = seccion.contornos.getLimitesV();
		
		SHFlexion resCal = seccion.getResultados();
		//double Br = seccion.getGenerales().hormigon.Bf;
		//double escalaT = area.width/3/Br;
		
		int X0 = dx+SHDibujar.transformar(0, corrimientoX, escalaX);
		int Y0 = dy+SHDibujar.transformar(0, corrimientoY, escalaY);
		int Ybs = dy+SHDibujar.transformar(limV.max, corrimientoY, escalaY);
		int Yen = dy+SHDibujar.transformar(limV.max-resCal.recta_ultima.X, corrimientoY, escalaY);
		
		//int l = (int)(area.width*.03);
		
		// Dibuja x	
		String txt = "x="+String.valueOf(MPBE.redondear(seccion.getResultados().recta_ultima.X, 2));
		dibCotaV(dx+20, Yen, Ybs, txt);
		// Dibuja a
		double a = seccion.getResultados().esfuerzo_ultimos.a;
		int Ya = dy+SHDibujar.transformar(a, corrimientoY, escalaY);
		txt = "a="+String.valueOf(MPBE.redondear(a, 2));
		dibCotaV(X0-40, Y0, Ya, txt);
		// Dibuja z
		double z = seccion.getResultados().esfuerzo_ultimos.z;
		int Yz = dy+SHDibujar.transformar(z, corrimientoY, escalaY);
		txt = "z="+String.valueOf(MPBE.redondear(z, 2));
		dibCotaV(X0-40, Y0, Yz, txt);
		// Dibuja Z
		txt = "Z="+String.valueOf(MPBE.redondear(a-z, 2));
		dibCotaV(X0-80, Ya, Yz, txt);
		
	}
	private void dibCotaV(int X, int Y1, int Y2, String txt) {
		//linea	
		gc.drawLine(X, Y1, X, Y2);
		if (Y1>Y2) {int aux = Y1; Y1 = Y2; Y2 = aux;}
		//flecha inf
		gc.drawLine(X, Y1, X-2, Y1+10);
		gc.drawLine(X, Y1, X+2, Y1+10);
		//flecha sup
		gc.drawLine(X, Y2, X-2, Y2-10);
		gc.drawLine(X, Y2, X+2, Y2-10);
		//texto
		Point tamTXT = gc.stringExtent(txt);//Obtiene el ancho de los cuadros de texto
		//gc.drawText(txt, X-20, Y1+(Y2-Y1)/2-tamTXT.y/2, SWT.DRAW_TRANSPARENT);
		
		
		
//		int xVertical = X-20;
//		int yVertical = Y1+(Y2-Y1)/2+tamTXT.x/2;
		int xHor = X-tamTXT.x/2;
		int yHor = Y1+(Y2-Y1)/2-tamTXT.y/2;
		//Transform t = new Transform(gc.getDevice());
//		Transform t = new Transform(this.display);
//		t.translate(xVertical, yVertical);
//		t.rotate(-90f);
//		gc.setTransform(t); //GENERA UN ERROR QUE CIERRA EL PROGRAMA
//		gc.drawText(txt, 0, 0, SWT.DRAW_TRANSPARENT);
		gc.drawText(txt, xHor, yHor, SWT.DRAW_TRANSPARENT);
//		t.rotate(90f);
//		t.translate(-xVertical, -yVertical);
//		gc.setTransform(t);  //GENERA UN ERROR QUE CIERRA EL PROGRAMA
//		t.dispose();		
	}


	//-----------------------------------------
	// Getter y setter de diametros
	//-----------------------------------------	
	/**
	 * @return
	 * @uml.property  name="diamBarras"
	 */
	public int getDiamBarras() {
		return diamBarras;
	}
	/**
	 * @param diamBarras
	 * @uml.property  name="diamBarras"
	 */
	public void setDiamBarras(int diamBarras) {
		this.diamBarras = diamBarras;
	}

	/**
	 * @return
	 * @uml.property  name="diamNodos"
	 */
	public int getDiamNodos() {
		return diamNodos;
	}
	/**
	 * @param diamNodos
	 * @uml.property  name="diamNodos"
	 */
	public void setDiamNodos(int diamNodos) {
		this.diamNodos = diamNodos;
	}


	public Hormigon_armado getSeccion() {
		return seccion;
	}
	public void setSeccion(Hormigon_armado seccion) {
		this.seccion = seccion;
	}
	
//	public Drawable getDrawable() {
//		return img;
//	}
//	public void setDrawable(Drawable img) {
//		this.img = img;
//		this.gc = new GC(img);
//	}
	public GC getGC() {return gc;}
	public void setGC(GC gc) {this.gc = gc;}
	
}
